﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PandemiaAdmin.Entidades;
using Pancliente;
using System.IO;
using System.Diagnostics;

namespace PandemiaAdmin.Funcionalidad
{
    public class AdminClientes : Admin
    {
        public void CrearClienteNet35(ConfiguracionCliente configuracion, string pathEjecutable, out string salidaCompliacion)
        {
            string carpeta = AppDomain.CurrentDomain.BaseDirectory + @"\Clientes\Net35";
            List<string> codigosFuente = new List<string>();
            string recurso = carpeta + @"\Form1.resx";

            GenerarArchivoModificado(configuracion, carpeta + @"\Program.cs", carpeta + @"\ProgramModificado.cs");
            codigosFuente.Add(carpeta + @"\AdminCliente.cs");
            codigosFuente.Add(carpeta + @"\ConfiguracionCliente.cs"); 
            codigosFuente.Add(carpeta + @"\Form1.cs");
            codigosFuente.Add(carpeta + @"\Form1.designer.cs");
            codigosFuente.Add(carpeta + @"\ProgramModificado.cs");
            codigosFuente.Add(carpeta + @"\Soporte\Reference.cs");
            codigosFuente.Add(carpeta + @"\Transferencia\Reference.cs");

            string vergopolis = string.Empty;
            foreach (string codigoFuente in codigosFuente)
                vergopolis += "\"" + codigoFuente + "\" ";
            vergopolis = vergopolis.TrimEnd();

            ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe");
            info.Arguments = string.Format("/out:{0} /t:winexe /res:{1} {2} ", pathEjecutable, recurso, vergopolis);
            info.UseShellExecute = false;
            info.RedirectStandardOutput = info.RedirectStandardError = true;

            Process process = new Process();
            process.StartInfo = info;
            process.Start();

            StringBuilder error = new StringBuilder();
            while (!process.StandardError.EndOfStream)
                error.AppendLine(process.StandardError.ReadLine());

            StringBuilder salida = new StringBuilder();
            while (!process.StandardOutput.EndOfStream)
                salida.AppendLine(process.StandardOutput.ReadLine());

            if (error.Length > 0)
                salidaCompliacion = error.ToString();
            else if (salida.Length > 0)
                salidaCompliacion = salida.ToString();
            else
                salidaCompliacion = null;
        }

        private void GenerarArchivoModificado(ConfiguracionCliente configuracion, string archivoBase, string archivoNuevo)
        {
            string codigoFuenteBase = File.ReadAllText(archivoBase);

            if (configuracion.ArchivoErrores != null && configuracion.ArchivoErrores.Length > 0)
                codigoFuenteBase = codigoFuenteBase.Replace("= \"ARCHIVO_ERRORES_VALOR\"", "= @\"" + configuracion.ArchivoErrores + "\"");

            codigoFuenteBase = codigoFuenteBase.Replace("= \"SOPORTE_URL_VALOR\"", "= @\"" + configuracion.SoporteURL + "\"");
            codigoFuenteBase = codigoFuenteBase.Replace("= \"TRANSFERENCIA_URL_VALOR\"", "= @\"" + configuracion.TransferenciaURL + "\"");

            if (configuracion.CarpetaInstalacion != null && configuracion.CarpetaInstalacion.Length > 0)
                codigoFuenteBase = codigoFuenteBase.Replace("= \"CARPETA_INSTALACION_VALOR\"", "= @\"" + configuracion.CarpetaInstalacion + "\"");

            if (configuracion.ClaveRegistro != null && configuracion.ClaveRegistro.Length > 0)
                codigoFuenteBase = codigoFuenteBase.Replace("= \"CLAVE_REGISTRO_VALOR\"", "= @\"" + configuracion.ClaveRegistro + "\"");

            codigoFuenteBase = codigoFuenteBase.Replace("= \"ALIAS_VALOR\"", "= @\"" + configuracion.Alias + "\"");

            File.WriteAllText(archivoNuevo, codigoFuenteBase);
        }
    }
}
